001/*
002 * Licensed to the Apache Software Foundation (ASF) under one
003 * or more contributor license agreements.  See the NOTICE file
004 * distributed with this work for additional information
005 * regarding copyright ownership.  The ASF licenses this file
006 * to you under the Apache License, Version 2.0 (the
007 * "License"); you may not use this file except in compliance
008 * with the License.  You may obtain a copy of the License at
009 *
010 *   http://www.apache.org/licenses/LICENSE-2.0
011 *
012 * Unless required by applicable law or agreed to in writing,
013 * software distributed under the License is distributed on an
014 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
015 * KIND, either express or implied.  See the License for the
016 * specific language governing permissions and limitations
017 * under the License.
018 */
019package org.apache.maven.scm.provider.git.gitexe.command.diff;
020
021import java.util.ArrayList;
022import java.util.List;
023
024import org.apache.maven.scm.ScmFile;
025import org.apache.maven.scm.ScmFileStatus;
026import org.apache.maven.scm.util.AbstractConsumer;
027
028/**
029 * @author <a href="mailto:struberg@yahoo.de">Mark Struberg</a>
030 */
031public class GitDiffRawConsumer extends AbstractConsumer {
032    private final List<ScmFile> changedFiles = new ArrayList<>();
033
034    // ----------------------------------------------------------------------
035    // StreamConsumer Implementation
036    // ----------------------------------------------------------------------
037
038    /**
039     * {@inheritDoc}
040     */
041    public void consumeLine(String line) {
042        if (logger.isDebugEnabled()) {
043            logger.debug(line);
044        }
045        if (line == null || line.isEmpty()) {
046            return;
047        }
048
049        ScmFileStatus status = null;
050
051        String[] parts = line.split("\\s", 6);
052        if (parts.length != 6) {
053            logger.warn("Skipping line because it doesn't contain the right status parameters: " + line);
054            return;
055        }
056
057        String modus = parts[4];
058        String file = parts[5];
059
060        if ("A".equals(modus)) {
061            status = ScmFileStatus.ADDED;
062        } else if ("M".equals(modus)) {
063            // attention! 'M' is 'updated', and _not_ ScmFileStatus.MODIFIED (which is for 'modified locally')
064            status = ScmFileStatus.UPDATED;
065        } else if ("D".equals(modus)) {
066            status = ScmFileStatus.DELETED;
067        } else {
068            logger.warn("unknown status detected in line: " + line);
069            return;
070        }
071
072        changedFiles.add(new ScmFile(file, status));
073    }
074
075    public List<ScmFile> getChangedFiles() {
076        return changedFiles;
077    }
078}