@@ -240,8 +240,23 @@ commit_and_push_country() {
240240 # Ensure we're on main branch
241241 git checkout main 2> /dev/null || true
242242
243- # Pull latest changes
244- git pull origin main 2> /dev/null || true
243+ # Abort any ongoing merge to start clean
244+ if [[ -f " ${DATA_REPO_DIR} /.git/MERGE_HEAD" ]]; then
245+ print_warn " Aborting ongoing merge to start clean..."
246+ git merge --abort 2> /dev/null || true
247+ fi
248+
249+ # Pull latest changes, handling conflicts gracefully
250+ git fetch origin main 2> /dev/null || true
251+ if ! git pull --no-edit origin main 2> /dev/null; then
252+ # Pull failed due to conflicts, resolve by taking remote version for CSV files
253+ # (we don't care about CSV conflicts for JSON export)
254+ print_warn " Merge conflict detected, resolving (taking remote version for CSV files)..."
255+ git checkout --theirs csv/notes-by-country/* .csv 2> /dev/null || true
256+ git checkout --theirs csv/notes-by-country/README.md 2> /dev/null || true
257+ git add csv/notes-by-country/* .csv csv/notes-by-country/README.md 2> /dev/null || true
258+ git commit --no-edit 2> /dev/null || git merge --abort 2> /dev/null || true
259+ fi
245260
246261 # Add only this country file
247262 local country_file=" data/countries/${country_id} .json"
@@ -285,7 +300,23 @@ remove_obsolete_countries() {
285300
286301 cd " ${DATA_REPO_DIR} "
287302 git checkout main 2> /dev/null || true
288- git pull origin main 2> /dev/null || true
303+
304+ # Abort any ongoing merge to start clean
305+ if [[ -f " ${DATA_REPO_DIR} /.git/MERGE_HEAD" ]]; then
306+ print_warn " Aborting ongoing merge to start clean..."
307+ git merge --abort 2> /dev/null || true
308+ fi
309+
310+ # Pull latest changes, handling conflicts gracefully
311+ git fetch origin main 2> /dev/null || true
312+ if ! git pull --no-edit origin main 2> /dev/null; then
313+ # Pull failed due to conflicts, resolve by taking remote version for CSV files
314+ print_warn " Merge conflict detected, resolving (taking remote version for CSV files)..."
315+ git checkout --theirs csv/notes-by-country/* .csv 2> /dev/null || true
316+ git checkout --theirs csv/notes-by-country/README.md 2> /dev/null || true
317+ git add csv/notes-by-country/* .csv csv/notes-by-country/README.md 2> /dev/null || true
318+ git commit --no-edit 2> /dev/null || git merge --abort 2> /dev/null || true
319+ fi
289320
290321 # Get list of country IDs from database
291322 local db_countries_file
@@ -302,14 +333,17 @@ ORDER BY country_id;
302333 github_countries_file=$( mktemp " /tmp/github_countries_XXXXXX.txt" )
303334 if [[ -d " ${DATA_REPO_DIR} /data/countries" ]]; then
304335 find " ${DATA_REPO_DIR} /data/countries" -name " *.json" -type f \
305- | sed ' s|.*/||' | sed ' s|\.json$||' | sort > " ${github_countries_file} "
336+ | sed ' s|.*/||' | sed ' s|\.json$||' | sort -n > " ${github_countries_file} "
306337 else
307338 touch " ${github_countries_file} "
308339 fi
309340
341+ # Ensure both files are sorted numerically for comm (country_id is numeric)
342+ sort -n -o " ${db_countries_file} " " ${db_countries_file} " 2> /dev/null || true
343+
310344 # Find countries in GitHub that are not in database
311345 local obsolete_countries
312- obsolete_countries=$( comm -23 " ${github_countries_file} " " ${db_countries_file} " )
346+ obsolete_countries=$( comm -23 " ${github_countries_file} " " ${db_countries_file} " 2> /dev/null || echo " " )
313347
314348 rm -f " ${db_countries_file} " " ${github_countries_file} "
315349
@@ -464,7 +498,24 @@ update_country_index() {
464498 # Commit and push index
465499 cd " ${DATA_REPO_DIR} "
466500 git checkout main 2> /dev/null || true
467- git pull origin main 2> /dev/null || true
501+
502+ # Abort any ongoing merge to start clean
503+ if [[ -f " ${DATA_REPO_DIR} /.git/MERGE_HEAD" ]]; then
504+ print_warn " Aborting ongoing merge to start clean..."
505+ git merge --abort 2> /dev/null || true
506+ fi
507+
508+ # Pull latest changes, handling conflicts gracefully
509+ git fetch origin main 2> /dev/null || true
510+ if ! git pull --no-edit origin main 2> /dev/null; then
511+ # Pull failed due to conflicts, resolve by taking remote version for CSV files
512+ print_warn " Merge conflict detected, resolving (taking remote version for CSV files)..."
513+ git checkout --theirs csv/notes-by-country/* .csv 2> /dev/null || true
514+ git checkout --theirs csv/notes-by-country/README.md 2> /dev/null || true
515+ git add csv/notes-by-country/* .csv csv/notes-by-country/README.md 2> /dev/null || true
516+ git commit --no-edit 2> /dev/null || git merge --abort 2> /dev/null || true
517+ fi
518+
468519 git add " data/indexes/countries.json"
469520
470521 if ! git diff --cached --quiet; then
@@ -530,7 +581,31 @@ print_info "Countries per batch: ${COUNTRIES_PER_BATCH}"
530581# Ensure data repository is up to date
531582cd " ${DATA_REPO_DIR} "
532583git checkout main 2> /dev/null || true
533- git pull origin main 2> /dev/null || true
584+
585+ # Abort any ongoing merge to start clean
586+ if [[ -f " ${DATA_REPO_DIR} /.git/MERGE_HEAD" ]]; then
587+ print_warn " Aborting ongoing merge to start clean..."
588+ git merge --abort 2> /dev/null || true
589+ fi
590+
591+ # Push any pending commits first
592+ git fetch origin main 2> /dev/null || true
593+ local_ahead=$( git rev-list --count origin/main..HEAD 2> /dev/null || echo " 0" )
594+ if [[ " ${local_ahead} " -gt 0 ]]; then
595+ print_info " Pushing ${local_ahead} pending commit(s) to origin..."
596+ git push origin main 2> /dev/null || print_warn " Failed to push pending commits, continuing anyway..."
597+ fi
598+
599+ # Pull latest changes, handling conflicts gracefully
600+ if ! git pull --no-edit origin main 2> /dev/null; then
601+ # Pull failed due to conflicts, resolve by taking remote version for CSV files
602+ # (we don't care about CSV conflicts for JSON export)
603+ print_warn " Merge conflict detected, resolving (taking remote version for CSV files)..."
604+ git checkout --theirs csv/notes-by-country/* .csv 2> /dev/null || true
605+ git checkout --theirs csv/notes-by-country/README.md 2> /dev/null || true
606+ git add csv/notes-by-country/* .csv csv/notes-by-country/README.md 2> /dev/null || true
607+ git commit --no-edit 2> /dev/null || git merge --abort 2> /dev/null || true
608+ fi
534609
535610# Create countries directory if it doesn't exist
536611mkdir -p " ${DATA_REPO_DIR} /data/countries"
0 commit comments