Skip to content

Commit c8ec6e2

Browse files
committed
feat: Enhance Git operations in exportAndPushJSONToGitHub.sh for conflict resolution and data integrity
- Implemented logic to abort ongoing merges before pulling the latest changes, ensuring a clean state for updates. - Enhanced the pull process to handle merge conflicts gracefully by automatically resolving conflicts for CSV files, allowing for smoother JSON exports. - Added sorting for country IDs in the temporary files to ensure consistent comparisons. - Improved error handling during Git operations to maintain data integrity and provide clearer feedback on the process.
1 parent a168ae3 commit c8ec6e2

File tree

2 files changed

+83
-8
lines changed

2 files changed

+83
-8
lines changed

bin/dwh/exportAndPushJSONToGitHub.sh

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -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
531582
cd "${DATA_REPO_DIR}"
532583
git 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
536611
mkdir -p "${DATA_REPO_DIR}/data/countries"

lib/osm-common

0 commit comments

Comments
 (0)