Skip to content

Commit

Permalink
Use atomic updates to the fast-import mark file
Browse files Browse the repository at this point in the history
When we allow fast-import frontends to reload a mark file from a
prior session we want to let them use the same file as they exported
the marks to.  This makes it very simple for the frontend to save
state across incremental imports.

But we don't want to lose the old marks table if anything goes wrong
while writing our current marks table.  So instead of truncating and
overwriting the path specified to --export-marks we use the standard
lockfile code to write the current marks out to a temporary file,
then rename it over the old marks table.

Signed-off-by: Shawn O. Pearce <spearce@spearce.org>
  • Loading branch information
Shawn O. Pearce committed Mar 7, 2007
1 parent 93e72d8 commit 60b9004
Showing 1 changed file with 26 additions and 9 deletions.
35 changes: 26 additions & 9 deletions fast-import.c
Original file line number Diff line number Diff line change
Expand Up @@ -1375,16 +1375,33 @@ static void dump_marks_helper(FILE *f,

static void dump_marks(void)
{
if (mark_file)
{
FILE *f = fopen(mark_file, "w");
if (f) {
dump_marks_helper(f, 0, marks);
fclose(f);
} else
failure |= error("Unable to write marks file %s: %s",
mark_file, strerror(errno));
static struct lock_file mark_lock;
int mark_fd;
FILE *f;

if (!mark_file)
return;

mark_fd = hold_lock_file_for_update(&mark_lock, mark_file, 0);
if (mark_fd < 0) {
failure |= error("Unable to write marks file %s: %s",
mark_file, strerror(errno));
return;
}

f = fdopen(mark_fd, "w");
if (!f) {
rollback_lock_file(&mark_lock);
failure |= error("Unable to write marks file %s: %s",
mark_file, strerror(errno));
return;
}

dump_marks_helper(f, 0, marks);
fclose(f);
if (commit_lock_file(&mark_lock))
failure |= error("Unable to write marks file %s: %s",
mark_file, strerror(errno));
}

static void read_next_command(void)
Expand Down

0 comments on commit 60b9004

Please sign in to comment.