/**
 * Main function and starting point of this script:
 * Bootstrap Drupal, gather commit data and pass it on to Version Control API.
 */
function xcvs_init($argc, $argv)
{
    $date = time();
    // remember the time of the current commit for later
    $this_file = array_shift($argv);
    // argv[0]
    if ($argc < 7) {
        xcvs_help($this_file, STDERR);
        exit(3);
    }
    $config_file = array_shift($argv);
    // argv[1]
    $username = array_shift($argv);
    // argv[2]
    $commitdir = '/' . array_shift($argv);
    // argv[3]
    // Load the configuration file and bootstrap Drupal.
    if (!file_exists($config_file)) {
        fwrite(STDERR, "Error: failed to load configuration file.\n");
        exit(4);
    }
    include_once $config_file;
    // Check temporary file storage.
    $tempdir = xcvs_get_temp_directory($xcvs['temp']);
    // The commitinfo script wrote the lastlog file for us.
    // Its only contents is the name of the last directory that commitinfo
    // was invoked with, and that order is the same one as for loginfo.
    $lastlog = $tempdir . '/xcvs-lastlog.' . posix_getpgrp();
    $summary = $tempdir . '/xcvs-summary.' . posix_getpgrp();
    // Write the changed items to a temporary log file, one by one.
    if (!empty($argv)) {
        if ($argv[0] == '- New directory') {
            xcvs_log_add($summary, "{$commitdir},dir\n", 'a');
        } else {
            while (!empty($argv)) {
                $filename = array_shift($argv);
                $old = array_shift($argv);
                $new = array_shift($argv);
                xcvs_log_add($summary, "{$commitdir}/{$filename},{$old},{$new}\n", 'a');
            }
        }
    }
    // Once all logs in a multi-directory commit have been gathered,
    // the currently processed directory matches the last processed directory
    // that commitinfo was invoked with, which means we've got all the
    // needed data in the summary file.
    if (xcvs_is_last_directory($lastlog, $commitdir)) {
        // Convert the previously written temporary log file
        // to Version Control API's commit action format.
        $fd = fopen($summary, "r");
        if ($fd === FALSE) {
            fwrite(STDERR, "Error: failed to open summary log at {$summary}.\n");
            xcvs_exit(5, $lastlog, $summary);
        }
        $operation_items = array();
        // Do a full Drupal bootstrap. We need it from now on at the latest,
        // starting with the action constants in xcvs_get_operation_item().
        xcvs_bootstrap($xcvs);
        while (!feof($fd)) {
            $file_entry = trim(fgets($fd));
            list($path, $item) = xcvs_get_operation_item($file_entry);
            if ($path) {
                $operation_items[$path] = $item;
            }
        }
        fclose($fd);
        // Integrate with the Drupal Version Control API.
        if (!empty($operation_items)) {
            // Get the remaining info from the commit log that we get from STDIN.
            list($branch_name, $message) = xcvs_parse_log(STDIN);
            // Add the real revision to deleted items.
            xcvs_fix_operation_items($operation_items, $branch_name);
            // Determine how many lines were added and removed for a given file.
            xcvs_fetch_item_line_changes($operation_items);
            // Prepare the data for passing it to Version Control API.
            $operation = array('type' => VERSIONCONTROL_OPERATION_COMMIT, 'repo_id' => $xcvs['repo_id'], 'date' => $date, 'username' => $username, 'message' => $message, 'revision' => '', 'labels' => array(array('type' => VERSIONCONTROL_OPERATION_BRANCH, 'name' => $branch_name, 'action' => VERSIONCONTROL_ACTION_MODIFIED)));
            _versioncontrol_cvs_fix_commit_operation_items($operation, $operation_items);
            $operation = versioncontrol_insert_operation($operation, $operation_items);
            if (!empty($operation)) {
                fwrite(STDERR, t("Recorded as commit !id.\n", array('!id' => versioncontrol_format_operation_revision_identifier($operation))));
            }
        }
        // Clean up
        xcvs_exit(0, $lastlog, $summary);
    }
    exit(0);
}
function xcvs_init($argc, $argv)
{
    $this_file = array_shift($argv);
    // argv[0]
    if ($argc < 5) {
        xcvs_help($this_file, STDERR);
        exit(3);
    }
    $files = array_slice($argv, 4);
    $config_file = array_shift($argv);
    // argv[1]
    $username = array_shift($argv);
    // argv[2]
    $dir = array_shift($argv);
    // argv[3]
    $filenames = $argv;
    // the rest of the command line arguments
    // Load the configuration file and bootstrap Drupal.
    if (!file_exists($config_file)) {
        fwrite(STDERR, "Error: failed to load configuration file.\n");
        exit(4);
    }
    include_once $config_file;
    // Check temporary file storage.
    $tempdir = xcvs_get_temp_directory($xcvs['temp']);
    // Admins and other privileged users don't need to go through any checks.
    if (!in_array($username, $xcvs['allowed_users'])) {
        // Do a full Drupal bootstrap.
        xcvs_bootstrap($xcvs);
        // Construct a minimal commit operation array.
        $operation = array('type' => VERSIONCONTROL_OPERATION_COMMIT, 'repo_id' => $xcvs['repo_id'], 'username' => $username, 'labels' => xcvs_commit_labels($xcvs['cwd']));
        $operation_items = array();
        foreach ($filenames as $filename) {
            list($path, $item) = xcvs_get_operation_item($filename, $dir, $xcvs['cwd']);
            $operation_items[$path] = $item;
        }
        $access = versioncontrol_has_write_access($operation, $operation_items);
        // Fail and print out error messages if commit access has been denied.
        if (!$access) {
            fwrite(STDERR, implode("\n\n", versioncontrol_get_access_errors()) . "\n\n");
            exit(6);
        }
    }
    // If we get as far as this, the commit may happen.
    // Remember this directory so that loginfo can combine commits
    // from different directories in one commit entry.
    $lastlog = $tempdir . '/xcvs-lastlog.' . posix_getpgrp();
    xcvs_log_add($lastlog, $dir);
    exit(0);
}