git/list[1] front-page[2] threads[3] people[4] search[5] about
 

Re: [PATCH v7 15/16] remote-svn: add marks-file regeneration

From
Junio C Hamano <gitster@pobox.com>
Date
Aug 28, 2012, 17:59 UTC
Message-ID
<7vpq6a28tp.fsf@alter.siamese.dyndns.org>
In-Reply-To
<1346143790-23491-16-git-send-email-florian.achleitner.2.6.31@gmail.com>
Florian Achleitner <florian.achleitner.2.6.31@gmail.com> writes:
Show 40 quoted lines
> fast-import mark files are stored outside the object database and are
> therefore not fetched and can be lost somehow else.  marks provide a
> svn revision --> git sha1 mapping, while the notes that are attached
> to each commit when it is imported provide a git sha1 --> svn revision
> mapping.
>
> If the marks file is not available or not plausible, regenerate it by
> walking through the notes tree.  , i.e.  The plausibility check tests
> if the highest revision in the marks file matches the revision of the
> top ref. It doesn't ensure that the mark file is completely correct.
> This could only be done with an effort equal to unconditional
> regeneration.
>
> Signed-off-by: Florian Achleitner <florian.achleitner.2.6.31@gmail.com>
> Signed-off-by: Junio C Hamano <gitster@pobox.com>
> ---
>  remote-testsvn.c |   68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++
>  1 file changed, 68 insertions(+)
>
> diff --git a/remote-testsvn.c b/remote-testsvn.c
> index e90d221..d0b81d5 100644
> --- a/remote-testsvn.c
> +++ b/remote-testsvn.c
> @@ -86,6 +86,73 @@ static int parse_rev_note(const char *msg, struct rev_note *res) {
>  	return 0;
>  }
>  
> +static int note2mark_cb(const unsigned char *object_sha1,
> +		const unsigned char *note_sha1, char *note_path,
> +		void *cb_data) {
> +	FILE *file = (FILE *)cb_data;
> +	char *msg;
> +	unsigned long msglen;
> +	enum object_type type;
> +	struct rev_note note;
> +	if (!(msg = read_sha1_file(note_sha1, &type, &msglen)) ||
> +			!msglen || type != OBJ_BLOB) {
> +		free(msg);
> +		return 1;
> +	}

The same comments as an earlier patch in the series applies here, regarding chained assignments in coditional, whether each case is an error that needs to be reported, and the sign of the error return value.

Show 21 quoted lines
> +	if (parse_rev_note(msg, &note))
> +		return 2;
> +	if (fprintf(file, ":%d %s\n", note.rev_nr, sha1_to_hex(object_sha1)) < 1)
> +		return 3;
> +	return 0;
> +}
> +
> +static void regenerate_marks(void)
> +{
> +	int ret;
> +	FILE *marksfile;
> +	marksfile = fopen(marksfilename, "w+");
> +	if (!marksfile)
> +		die_errno("Couldn't create mark file %s.", marksfilename);
> +	ret = for_each_note(NULL, 0, note2mark_cb, marksfile);
> +	if (ret)
> +		die("Regeneration of marks failed, returned %d.", ret);
> +	fclose(marksfile);
> +}
> +
> +static void check_or_regenerate_marks(int latestrev) {
Style.
Show 7 quoted lines
> +	FILE *marksfile;
> +	struct strbuf sb = STRBUF_INIT;
> +	struct strbuf line = STRBUF_INIT;
> +	int found = 0;
> +
> +	if (latestrev < 1)
> +		return;

It's more pleasant to read to have a blank line between the end of decls and the first statement, like this function does. Please fix two functions that appear before this function in this file to match.

Show 36 quoted lines
> +	init_notes(NULL, notes_ref, NULL, 0);
> +	marksfile = fopen(marksfilename, "r");
> +	if (!marksfile) {
> +		regenerate_marks();
> +		marksfile = fopen(marksfilename, "r");
> +		if (!marksfile)
> +			die_errno("cannot read marks file %s!", marksfilename);
> +		fclose(marksfile);
> +	} else {
> +		strbuf_addf(&sb, ":%d ", latestrev);
> +		while (strbuf_getline(&line, marksfile, '\n') != EOF) {
> +			if (!prefixcmp(line.buf, sb.buf)) {
> +				found++;
> +				break;
> +			}
> +		}
> +		fclose(marksfile);
> +		if (!found)
> +			regenerate_marks();
> +	}
> +	free_notes(NULL);
> +	strbuf_release(&sb);
> +	strbuf_release(&line);
> +}
> +
>  static int cmd_import(const char *line)
>  {
>  	int code;
> @@ -111,6 +178,7 @@ static int cmd_import(const char *line)
>  			free(note_msg);
>  		}
>  	}
> +	check_or_regenerate_marks(startrev - 1);
>  
>  	if (dump_from_file) {
>  		dumpin_fd = open(url, O_RDONLY);
Previous: Junio C HamanoNext: Junio C Hamano
Message 19 of 26 in “GSOC remote-svn”
  1. 00/16 GSOC remote-svnFlorian Achleitner, Aug 28, 2012
  2. 01/16 Implement a remote helper for svn in CFlorian Achleitner, Aug 28, 2012
  3. 02/16 Add git-remote-testsvn to MakefileFlorian Achleitner, Aug 28, 2012
  4. 03/16 Add svndump_init_fd to allow reading dumps from arbitrary FDsFlorian Achleitner, Aug 28, 2012
  5. 04/16 Add argv_array_detach and argv_array_free_detachedFlorian Achleitner, Aug 28, 2012
  6. 05/16 Connect fast-import to the remote-helper via pipe, adding 'bidi-import' capabilityFlorian Achleitner, Aug 28, 2012
  7. 06/16 Add documentation for the 'bidi-import' capability of remote-helpersFlorian Achleitner, Aug 28, 2012
  8. 07/16 When debug==1, start fast-import with "--stats" instead of "--quiet"Florian Achleitner, Aug 28, 2012
  9. 08/16 remote-svn, vcs-svn: Enable fetching to private refsFlorian Achleitner, Aug 28, 2012
  10. 09/16 Allow reading svn dumps from files via file:// urlsFlorian Achleitner, Aug 28, 2012
  11. 10/16 vcs-svn: add fast_export_note to create notesFlorian Achleitner, Aug 28, 2012
  12. 11/16 Create a note for every imported commit containing svn metadataFlorian Achleitner, Aug 28, 2012
  13. 12/16 remote-svn: Activate import/export-marks for fast-importFlorian Achleitner, Aug 28, 2012
  14. 13/16 remote-svn: add incremental importFlorian Achleitner, Aug 28, 2012
  15. 14/16 Add a svnrdump-simulator replaying a dump file for testingFlorian Achleitner, Aug 28, 2012
  16. 15/16 remote-svn: add marks-file regenerationFlorian Achleitner, Aug 28, 2012
  17. 16/16 Add a test script for remote-svnFlorian Achleitner, Aug 28, 2012
  18. Junio C HamanoAug 28, 2012
  19. Junio C HamanoAug 28, 2012
  20. Junio C HamanoAug 28, 2012
  21. Junio C HamanoAug 28, 2012
  22. Junio C HamanoAug 28, 2012
  23. Junio C HamanoAug 28, 2012
  24. Junio C HamanoAug 28, 2012
  25. Junio C HamanoAug 28, 2012
  26. Florian AchleitnerAug 28, 2012

Read the whole thread, see it on lore, or plain text.

$ cat FOOTERMessages come from the public archive at lore.kernel.org/git, fetched every hour. The front page is chosen and written each morning by an AI editor and can be wrong; the threads themselves are the record. About and API. For agents: an MCP server at https://gitlist.dev/mcp, and any thread, story or person page as Markdown by adding .md to its URL (or sending Accept: text/markdown). Details in /llms.txt.