| 852 | } |
| 853 | |
| 854 | int reftable_addition_add(struct reftable_addition *add, |
| 855 | int (*write_table)(struct reftable_writer *wr, |
| 856 | void *arg), |
| 857 | void *arg) |
| 858 | { |
| 859 | struct reftable_buf temp_tab_file_name = REFTABLE_BUF_INIT; |
| 860 | struct reftable_buf tab_file_name = REFTABLE_BUF_INIT; |
| 861 | struct reftable_buf next_name = REFTABLE_BUF_INIT; |
| 862 | struct reftable_writer *wr = NULL; |
| 863 | struct reftable_tmpfile tab_file = REFTABLE_TMPFILE_INIT; |
| 864 | struct fd_writer writer = { |
| 865 | .opts = &add->stack->opts, |
| 866 | }; |
| 867 | int err = 0; |
| 868 | |
| 869 | reftable_buf_reset(&next_name); |
| 870 | |
| 871 | err = format_name(&next_name, add->next_update_index, add->next_update_index); |
| 872 | if (err < 0) |
| 873 | goto done; |
| 874 | |
| 875 | err = stack_filename(&temp_tab_file_name, add->stack, next_name.buf); |
| 876 | if (err < 0) |
| 877 | goto done; |
| 878 | |
| 879 | err = reftable_buf_addstr(&temp_tab_file_name, ".temp.XXXXXX"); |
| 880 | if (err < 0) |
| 881 | goto done; |
| 882 | |
| 883 | err = tmpfile_from_pattern(&tab_file, temp_tab_file_name.buf); |
| 884 | if (err < 0) |
| 885 | goto done; |
| 886 | if (add->stack->opts.default_permissions) { |
| 887 | if (chmod(tab_file.path, |
| 888 | add->stack->opts.default_permissions)) { |
| 889 | err = REFTABLE_IO_ERROR; |
| 890 | goto done; |
| 891 | } |
| 892 | } |
| 893 | |
| 894 | writer.fd = tab_file.fd; |
| 895 | err = reftable_writer_new(&wr, fd_writer_write, fd_writer_flush, |
| 896 | &writer, &add->stack->opts); |
| 897 | if (err < 0) |
| 898 | goto done; |
| 899 | |
| 900 | err = write_table(wr, arg); |
| 901 | if (err < 0) |
| 902 | goto done; |
| 903 | |
| 904 | err = reftable_writer_close(wr); |
| 905 | if (err == REFTABLE_EMPTY_TABLE_ERROR) { |
| 906 | err = 0; |
| 907 | goto done; |
| 908 | } |
| 909 | if (err < 0) |
| 910 | goto done; |
| 911 | |